package Question9_8; import java.util.Arrays; public class Question { public static int makeChange(int amount, int[] denoms, int index) { if (index >= denoms.length - 1) return 1; // one denom remaining -> one way to do it int denomAmount = denoms[index]; int ways = 0; for (int i = 0; i * denomAmount <= amount; i++) { int amountRemaining = amount - i * denomAmount; ways += makeChange(amountRemaining, denoms, index + 1); // go to next denom } return ways; } public static int makeChange1(int n) { int[] denoms = {25, 10, 5, 1}; return makeChange(n, denoms, 0); } public static int makeChange2(int n) { int[] denoms = {25, 10, 5, 1}; int[][] map = new int[n + 1][denoms.length]; return makeChange2(n, denoms, 0, map); } public static int makeChange2(int amount, int[] denoms, int index, int[][] map) { if (map[amount][index] > 0) { // retrieve value return map[amount][index]; } if (index >= denoms.length - 1) return 1; // one denom remaining -> one way to do it int denomAmount = denoms[index]; int ways = 0; for (int i = 0; i * denomAmount <= amount; i++) { // go to next denom, assuming i coins of denomAmount int amountRemaining = amount - i * denomAmount; ways += makeChange2(amountRemaining, denoms, index + 1, map); } map[amount][index] = ways; return ways; } public static int makeChange(int n) { int x = makeChange1(n); int y = makeChange2(n); if (x != y) { System.out.println("Error: " + x + " " + y); } return x; } public static void main(String[] args) { for (int i = 0; i <= 100; i++) { System.out.println("makeChange(" + i + ") = " + makeChange(i)); } } }